{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Course overview\n",
    "\n",
    "The lecture notes and coding examples are presented in Jupyter notebooks. This ensures that the physics of a topic is immediately made operational in code and that you can try making changes to verify that you understand the underlying concepts. These notebooks are meant to be complementary to the video lectures, video quizzes, and assignments. \n",
    "\n",
    "The goal of this course is to show what benefits quantum technologies can provide to machine learning. In particular, we split this goal to the following objectives:\n",
    "\n",
    "1. **Quantum systems**. Quantum states, evolution, measurements, closed and open quantum systems. Basics of quantum many-body physics.\n",
    "\n",
    "2. **Quantum computing**. Quantum computing paradigms and implementations. Know the limitation of current and near-future quantum technologies and the kind of the tasks where they outperform or are expected to outperform classical computers. Variational circuits. Uses of quantum annealing.\n",
    "\n",
    "3. **Classical-quantum hybrid learning algorithms**. Encoding classical information in quantum systems. Discrete optimization in machine learning. Variational models in unsupervised learning. Kernel methods. Sampling and probabilistic models. \n",
    "\n",
    "4. **Coherent learning protocols**. Quantum phase estimation and quantum matrix inversion. Gaussian processes on a quantum computer. Self-exponentiation and quantum principal component analysis. Preparing a Gram matrix.\n",
    "\n",
    "Quantum computing has two main paradigms, the gate model and quantum annealing:\n",
    "\n",
    "<img src=\"figures/gate-model_vs_quantum_annealing.svg\" alt=\"The two main quantum computing paradigms\" style=\"width: 400px;\"/>\n",
    "\n",
    "As you will see, the two are quite different, but there are overlaps in what you can use them for. Both paradigms have a lot to offer to machine learning, and therefore we will study both.\n",
    "\n",
    "Each module in the course has several notebooks. To execute them, you have to install a handful of packages -- the details are in the subsequent sections of this notebook. The notebooks often have references to previous notebooks and therefore it is recommended to study them in order. The way quantum computing packages are structured, it is inevitable that some gate operations are used prior to their formal introduction. We kept these forward references to a minimum, but if you feel lost in the beginning, just refer to the notebook on circuits.\n",
    "\n",
    "# Environment\n",
    "\n",
    "We recommend you to use the [Anaconda distribution](https://www.anaconda.com/download/), as it will simplify installing packages. The rest of this notebook assumes that you use Anaconda.\n",
    "\n",
    "We recommend you to create a virtual environment for the course to avoid any interference with your usual Python environment. The course uses Python 3 and the code will not work under Python 2. The recommended version is >=3.5. Execute this command from the command line to create a new environment for the course: `conda create -n qmlmooc python=3.7`. Once it installs some basic packages, activate the environment by `conda activate qmlmooc`. \n",
    "\n",
    "# Packages\n",
    "\n",
    "Almost all packages can be installed with conda: `conda install jupyter matplotlib networkx numpy scikit-learn scipy`.\n",
    "\n",
    "The only packages not available are the ones produced by quantum hardware vendors. We will use many of their packages. You can install these with pip: `pip install dwave-networkx dimod minorminer qiskit qiskit-aqua`. As a quick sanity check, if you can execute the following cell without error messages, you should not face problems with the rest of the notebooks:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-19T19:29:52.113807Z",
     "start_time": "2018-11-19T19:29:51.038010Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/pwittek/.anaconda3/envs/qiskit/lib/python3.7/site-packages/marshmallow/schema.py:364: ChangedInMarshmallow3Warning: strict=False is not recommended. In marshmallow 3.0, schemas will always be strict. See https://marshmallow.readthedocs.io/en/latest/upgrading.html#schemas-are-always-strict\n",
      "  ChangedInMarshmallow3Warning\n"
     ]
    }
   ],
   "source": [
    "import matplotlib\n",
    "import networkx\n",
    "import numpy\n",
    "import sklearn\n",
    "import scipy\n",
    "\n",
    "import dwave_networkx\n",
    "import dimod\n",
    "import minorminer\n",
    "import qiskit\n",
    "import qiskit.aqua"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
